package com.example.admin.mybledemo;

import static com.example.admin.mybledemo.ota.OtaProtocol.APP_OTA_NOTIFY;
import static com.example.admin.mybledemo.ota.OtaProtocol.APP_OTA_SERVICE_UID;
import static com.example.admin.mybledemo.ota.OtaProtocol.APP_OTA_SERVICE_UID_V2;
import static com.example.admin.mybledemo.ota.OtaProtocol.APP_OTA_VERSION_UID;
import static com.example.admin.mybledemo.ota.OtaProtocol.APP_OTA_WRITE_UID;
import static com.example.admin.mybledemo.ota.OtaProtocol.BOOT_OTA_SERVICE_UID;

import android.app.Application;
import android.os.Build;
import java.util.UUID;

import cn.com.heaton.blelibrary.ble.Ble;
import cn.com.heaton.blelibrary.ble.BleLog;
import cn.com.heaton.blelibrary.ble.model.BleDevice;
import cn.com.heaton.blelibrary.ble.model.BleFactory;
import cn.com.heaton.blelibrary.ble.utils.UuidUtils;



public class MyApplication extends Application {

    private static MyApplication mApplication;

    @Override
    public void onCreate() {
        super.onCreate();
        mApplication = this;
        
        // 初始化网络兼容性配置
        initNetworkCompatibility();
        
        // 初始化蓝牙
        initBle();
    }

    /**
     * 初始化网络兼容性配置
     */
    private void initNetworkCompatibility() {
        try {
            // 设置HTTP客户端兼容性
            System.setProperty("http.keepAlive", "false");
            System.setProperty("http.maxConnections", "5");
            
        } catch (Exception e) {
            BleLog.e("MyApplication", "网络兼容性初始化失败: " + e.getMessage());
        }
    }

    //初始化蓝牙
    private void initBle() {
        try {
            Ble.options()
                    .setLogBleEnable(true)//设置是否输出打印蓝牙日志
                    .setThrowBleException(true)//设置是否抛出蓝牙异常
                    .setLogTAG("AndroidBLE")//设置全局蓝牙操作日志TAG
                    .setAutoConnect(false)//设置是否自动连接 - 禁用全局自动重连
                    .setParseScanData(true)//设置是否解析广播包
                    .setIgnoreRepeat(false)//设置是否过滤扫描到的设备(已扫描到的不会再次扫描)
                    .setConnectFailedRetryCount(3)//连接异常时（如蓝牙协议栈错误）,重新连接次数
                    .setConnectTimeout(10 * 1000)//设置连接超时时长
                    .setScanPeriod(12 * 1000)//设置扫描时长
                    .setMaxConnectNum(7)//最大连接数量
//                     临时注释掉UUID过滤器，以便发现所有BLE设备进行测试
                     .setUuidService(UUID.fromString(APP_OTA_SERVICE_UID))//设置主服务的uuid（APP模式）
                     .setUuidServicesExtra(new UUID[]{
                         UUID.fromString(BOOT_OTA_SERVICE_UID),  // Boot模式服务
                         UUID.fromString(APP_OTA_SERVICE_UID_V2) // V2版本服务
                     })//设置额外支持的服务UUID
                     .setUuidWriteCha(UUID.fromString(APP_OTA_WRITE_UID))//设置可写特征的uuid
                     .setUuidReadCha(UUID.fromString(APP_OTA_VERSION_UID))//设置可读特征的uuid （选填）
                     .setUuidNotifyCha(UUID.fromString(APP_OTA_NOTIFY))//设置可通知特征的uuid （选填，库中默认已匹配可通知特征的uuid）
                    .setFactory(new BleFactory<BleRssiDevice>() {//实现自定义BleDevice时必须设置
                        @Override
                        public BleRssiDevice create(String address, String name) {
                            return new BleRssiDevice(address, name);//自定义BleDevice的子类
                        }
                    })
                    .setBleWrapperCallback(OtaManager.getInstance().getBleCommunicator())
                    .create(mApplication, new Ble.InitCallback() {
                        @Override
                        public void success() {
                            BleLog.e("MainApplication", "初始化成功");
                        }

                        @Override
                        public void failed(int failedCode) {
                            BleLog.e("MainApplication", "初始化失败：" + failedCode);
                        }
                    });
        } catch (Exception e) {
            BleLog.e("MyApplication", "蓝牙初始化失败: " + e.getMessage());
        }
    }

    public static MyApplication getInstance() {
        return mApplication;
    }

}

